package bean

type AiReq struct {
	Model          string          `json:"model,omitempty"`           // 要调用的模型编码
	Messages       []*Message      `json:"messages,omitempty"`        // 调用语言模型时，当前对话消息列表作为模型的提示输入，以JSON数组形式提供，例如{"role": "user", "content": "Hello"}。可能的消息类型包括系统消息、用户消息、助手消息和工具消息
	RequestId      string          `json:"request_id,omitempty"`      // 由用户端传递，需要唯一；用于区分每次请求的唯一标识符。如果用户端未提供，平台将默认生成
	DoSample       *bool           `json:"do_sample,omitempty"`       // 当do_sample为true时，启用采样策略；当do_sample为false时，温度和top_p等采样策略参数将不生效，模型输出随机性会大幅度降低。默认值为true
	Stream         bool            `json:"stream,omitempty"`          // 该参数在使用同步调用时应设置为false或省略。表示模型在生成所有内容后一次性返回所有内容。默认值为false。如果设置为true，模型将通过标准Event Stream逐块返回生成的内容。当Event Stream结束时，将返回一个data: [DONE]消息
	Temperature    float64         `json:"temperature,omitempty"`     // 采样温度，控制输出的随机性，必须为正数 取值范围是：[0.0,1.0]， 默认值为 0.75，值越大，会使输出更随机，更具创造性；值越小，输出会更加稳定或确定 建议您根据应用场景调整 top_p 或 temperature 参数，但不要同时调整两个参数
	TopP           float64         `json:"top_p,omitempty"`           // 用温度取样的另一种方法，称为核取样 取值范围是：[0.0, 1.0]，默认值为 0.90 模型考虑具有 top_p 概率质量 tokens 的结果 例如：0.10 意味着模型解码器只考虑从前 10% 的概率的候选集中取 tokens 建议您根据应用场景调整 top_p 或 temperature 参数，但不要同时调整两个参数
	MaxTokens      int             `json:"max_tokens,omitempty"`      // 控制生成的响应的最大 token 数量， 默认值：动态计算（默认情况下，max_tokens的值会根据上下文长度减去输入长度来自动计算）最大值： max_tokens 最大支持4095，设置为超过 4095，则会被自动限制为 4095
	ResponseFormat *ResponseFormat `json:"response_format,omitempty"` // 指定模型输出格式，默认为 text, { "type": "text" }：文本输出模式，模型返回普通的文本输出。{ "type": "json_object" }：JSON输出模式，模型返回有效的 JSON 输出
	Stop           []string        `json:"stop,omitempty"`            // 模型遇到stop指定的字符时会停止生成。目前仅支持单个stop词，格式为["stop_word1"]
	Tools          []Tool          `json:"tools,omitempty"`           // 模型可以调用的工具

	// 工具类型，目前支持 function、retrieval、web_search
	// 1、function: `Object` (必需): 仅当工具类型为 function 时补充。
	// name: `String` (必需): 函数名称，只能包含 a-z、A-Z、0-9、下划线和连字符。最大长度限制为64。
	// description: `String` (必需): 用于描述函数的能力。模型将根据此描述确定函数调用的方式。
	// parameters: `Object` (必需): 参数字段必须传递一个Json Schema对象，以准确定义函数接受的参数。如果调用函数时不需要参数，则可以省略此参数。
	// 建议在使用 FunctionCall 时关闭 `do_sample`，或将 `temperature` 和 `top_p` 调整为较低值，以提高成功率
	//
	// 2、retrieval: `Object`
	// 描述: 仅当工具类型为 retrieval 时补充。
	// knowledge_id: `String` (必需): 涉及知识库ID时，请前往开放平台的知识库模块创建或获取。
	// prompt_template: `String` (非必需): 请求模型时的知识库模板，默认模板：
	// ```从文档 "{{ knowledge }}" 中查找问题的答案 "{{question}}" 如果找到答案，仅使用文档的陈述来回答问题；如果未找到，则使用自己的知识回答，并告知用户此信息不是来自文档。不要重复问题，直接开始回答。```
	// 用户自定义模板时，知识库内容占位符和用户端问题占位符必须分别为{{ knowledge }}和{{ question }};
	// 更多详情：Retrieval使用指南
	//
	// 3、web_search: `Object`
	// 描述: 仅当工具类型为 web_search 时补充，如果tools中存在type retrieval，则web_search将不生效。
	// enable: `Boolean` (非必需): 网络搜索功能：默认为关闭状态（False）。启用搜索：设置为 `True`。禁用搜索：设置为 `False`。
	// search_engine: `String` (必需): 指定搜索引擎类型，默认为：search_std。支持search_std、search_pro、search_pro_sogou、search_pro_quark、search_pro_jina 。
	// search_prompt: `String` (非必需): 指定搜索引擎输出结果的Prompt。
	// search_query: `String` (非必需): 强制自定义搜索键内容。
	// result_sequence : `String` (非必需): 指定搜索结果返回的顺序是在模型回复结果之前还是之后。默认为after。支持before、after。before是在模型回复之前返回搜索结果。
	// search_result: `Boolean` (非必需): 获取网页搜索来源的详细信息。默认禁用。启用：true，禁用：false
	Type       string `json:"type,omitempty"`
	ToolChoice any    `json:"tool_choice,omitempty"` // 用于控制模型选择调用哪个函数的方式，仅在工具类型为function时补充。默认auto，目前仅支持auto
	UserId     string `json:"user_id,omitempty"`     // 终端用户的唯一ID，帮助平台对终端用户的非法活动、生成非法不当信息或其他滥用行为进行干预。ID长度要求：至少6个字符，最多128个字符
}

type ResponseFormat struct {
	Type string `json:"type,omitempty"`
}

type Tool struct {
	Type     string        `json:"type,omitempty"`
	Function *FunctionDesc `json:"function,omitempty"`
}

type FunctionDesc struct {
	Name        string      `json:"name,omitempty"`
	Description string      `json:"description,omitempty"`
	Parameters  *Parameters `json:"parameters,omitempty"`
}

// NewEmptyParameters 创建无参数 Parameters
func NewEmptyParameters() *Parameters {
	return &Parameters{
		Type:       "object",
		Properties: map[string]any{},
		Required:   []string{},
	}
}

type Parameters struct {
	Type       string         `json:"type"`
	Properties map[string]any `json:"properties"` // 这里的any允许两种类型, Parameters 或 PropertiesItem
	Required   []string       `json:"required"`
}

type PropertiesItem struct {
	Type        string `json:"type,omitempty"`
	Description string `json:"description,omitempty"`
}
